home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / MTRECAL.PAK / RECALCVW.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  5KB  |  198 lines

  1. // recalcvw.cpp : implementation of the CRecalcView class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1995 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "stdafx.h"
  14. #include "mtrecalc.h"
  15. #include "calcthrd.h"
  16. #include "recaldoc.h"
  17. #include "recalcvw.h"
  18. #include "resource.h"
  19. #include "slowcalc.h"
  20.  
  21. #ifdef _DEBUG
  22. #undef THIS_FILE
  23. static char BASED_CODE THIS_FILE[] = __FILE__;
  24. #endif
  25.  
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CRecalcView
  28.  
  29. IMPLEMENT_DYNCREATE(CRecalcView, CFormView)
  30.  
  31. BEGIN_MESSAGE_MAP(CRecalcView, CFormView)
  32.     ON_MESSAGE(WM_USER_RECALC_DONE, OnRecalcDone)
  33.     ON_MESSAGE(WM_USER_RECALC_NOW, OnRecalcNowMsg)
  34.     //{{AFX_MSG_MAP(CRecalcView)
  35.     ON_EN_KILLFOCUS(IDC_INT1, OnKillFocus)
  36.     ON_EN_KILLFOCUS(IDC_INT2, OnKillFocus)
  37.     ON_COMMAND(ID_RECALCULATE_NOW, OnRecalculateNow)
  38.     //}}AFX_MSG_MAP
  39.     // Standard printing commands
  40.     ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
  41.     ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
  42. END_MESSAGE_MAP()
  43.  
  44. /////////////////////////////////////////////////////////////////////////////
  45. // CRecalcView construction/destruction
  46.  
  47. CRecalcView::CRecalcView()
  48.     : CFormView(CRecalcView::IDD)
  49. {
  50.     //{{AFX_DATA_INIT(CRecalcView)
  51.     m_nInt1 = 0;
  52.     m_nInt2 = 0;
  53.     //}}AFX_DATA_INIT
  54.  
  55.     m_bFirstKillFocus = FALSE;
  56. }
  57.  
  58. CRecalcView::~CRecalcView()
  59. {
  60. }
  61.  
  62. void CRecalcView::OnUpdate(
  63.     CView* /*pSender*/, LPARAM lHint, CObject* /*pHint*/)
  64. {
  65.     CRecalcDoc* pDoc = GetDocument();
  66.     if (lHint != UPDATE_HINT_SUM)
  67.     {
  68.         m_nInt1 = pDoc->m_nInt1;
  69.         m_nInt2 = pDoc->m_nInt2;
  70.         UpdateData(FALSE);
  71.     }
  72.  
  73.     CString strSum;
  74.     if (pDoc->m_bRecalcNeeded)
  75.     {
  76.         if (pDoc->m_bRecalcInProgress)
  77.             strSum.LoadString(IDS_RECALCULATING);
  78.         else
  79.             strSum = _T("?");
  80.     }
  81.     else
  82.     {
  83.         strSum.Format(_T("%i"), pDoc->m_nSum);
  84.     }
  85.     m_ctlSum.SetWindowText(strSum);
  86.     m_ctlSum.UpdateWindow();
  87. }
  88.  
  89. void CRecalcView::DoDataExchange(CDataExchange* pDX)
  90. {
  91.     CFormView::DoDataExchange(pDX);
  92.     //{{AFX_DATA_MAP(CRecalcView)
  93.     DDX_Control(pDX, IDC_SUM, m_ctlSum);
  94.     DDX_Text(pDX, IDC_INT1, m_nInt1);
  95.     DDX_Text(pDX, IDC_INT2, m_nInt2);
  96.     //}}AFX_DATA_MAP
  97. }
  98.  
  99. /////////////////////////////////////////////////////////////////////////////
  100. // CRecalcView printing
  101.  
  102. BOOL CRecalcView::OnPreparePrinting(CPrintInfo* pInfo)
  103. {
  104.     // default preparation
  105.     return DoPreparePrinting(pInfo);
  106. }
  107.  
  108. void CRecalcView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  109. {
  110. }
  111.  
  112. void CRecalcView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  113. {
  114. }
  115.  
  116. void CRecalcView::OnPrint(CDC*, CPrintInfo*)
  117. {
  118. }
  119.  
  120. /////////////////////////////////////////////////////////////////////////////
  121. // CRecalcView diagnostics
  122.  
  123. #ifdef _DEBUG
  124. void CRecalcView::AssertValid() const
  125. {
  126.     CFormView::AssertValid();
  127. }
  128.  
  129. void CRecalcView::Dump(CDumpContext& dc) const
  130. {
  131.     CFormView::Dump(dc);
  132. }
  133.  
  134. CRecalcDoc* CRecalcView::GetDocument() // non-debug version is inline
  135. {
  136.     return STATIC_DOWNCAST(CRecalcDoc, m_pDocument);
  137. }
  138. #endif //_DEBUG
  139.  
  140. /////////////////////////////////////////////////////////////////////////////
  141. // CRecalcView message handlers
  142.  
  143. void CRecalcView::OnRecalculateNow()
  144. {
  145.     if (!UpdateData())
  146.         return;
  147.  
  148.     GetDocument()->UpdateInt1AndInt2(m_nInt1, m_nInt2, TRUE);
  149. }
  150.  
  151. LRESULT CRecalcView::OnRecalcNowMsg(WPARAM, LPARAM)
  152. {
  153.     // The WM_USER_RECALC_NOW message is posted by the view to itself whenever
  154.     // the focus changes from one field to another.  The view cannot call
  155.     // UpdateData() from the WM_KILLFOCUS handler because UpdateData() will
  156.     // incorrectly try to call SetFocus() during the WM_KILLFOCUS if the
  157.     // field exchange (DDX) or validation (DDV) fails.
  158.  
  159.     // The WM_USER_RECALC_NOW message is also posted by the document in other
  160.     // circumstances (such as when the user is trying to save the document
  161.     // before it has been recalculated).    In this case, the kill focus
  162.     // problem is not an issue.
  163.  
  164.     BOOL bUpdateDataSuccess = UpdateData();
  165.     m_bFirstKillFocus = FALSE;
  166.     if (!bUpdateDataSuccess)
  167.         return 0;
  168.  
  169.     GetDocument()->UpdateInt1AndInt2(m_nInt1, m_nInt2, FALSE);
  170.     return 0;
  171. }
  172.  
  173. void CRecalcView::OnKillFocus()
  174. {
  175.     // See comment for OnRecalcNowMsg.
  176.  
  177.     // Only post the WM_USER_RECALC_NOW message if the view is not already
  178.     // in the process of handling the first kill focus.  If UpdateData() fails
  179.     // in the OnRecalcNowMsg handler, then the framework will call SetFocus()
  180.     // to set the focus back on the control with the invalid value.  The SetFocus()
  181.     // call will cause another WM_KILLFOCUS message to be sent.  If this OnKillFocus()
  182.     // handler were to post yet another WM_USER_RECALC_NOW message, the program would
  183.     // go into an infinite loop of attempting focus changes.
  184.  
  185.     if (!m_bFirstKillFocus)
  186.     {
  187.         PostMessage(WM_USER_RECALC_NOW, 0, 0);
  188.         m_bFirstKillFocus = TRUE;
  189.     }
  190. }
  191.  
  192.  
  193. LRESULT CRecalcView::OnRecalcDone(WPARAM, LPARAM)
  194. {
  195.     GetDocument()->RecalcDone();
  196.     return 0;
  197. }
  198.